From: Keir Fraser Date: Mon, 16 Jun 2008 14:22:41 +0000 (+0100) Subject: vmx: Allow restore of context from a non-Intel processor. In X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14192^2~61 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=31192a56d0b25cdd326cea0811a133688a86c188;p=xen.git vmx: Allow restore of context from a non-Intel processor. In particular, VMX requires segment 'granularity' to be set correctly, so we force it if need be in vmx_set_segment_register(). Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 3292dc2d23..fe5c2ece94 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -616,7 +616,7 @@ static void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data) struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state; /* restore msrs */ - guest_state->flags = data->msr_flags; + guest_state->flags = data->msr_flags & 7; guest_state->msrs[VMX_INDEX_MSR_LSTAR] = data->msr_lstar; guest_state->msrs[VMX_INDEX_MSR_STAR] = data->msr_star; guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK] = data->msr_syscall_mask; @@ -791,6 +791,9 @@ static void vmx_set_segment_register(struct vcpu *v, enum x86_segment seg, if ( !reg->attr.fields.p ) attr |= (1u << 16); + /* VMX has strict consistency requirement for flag G. */ + attr |= !!(reg->limit >> 20) << 15; + vmx_vmcs_enter(v); switch ( seg )